package com.medical.core.factory;

import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;

import java.io.IOException;

/**
 *  @PropertySource 是Spring framework的一个注解，用于指定外部属性文件（如：.properties或.yml），并将这些文件中的属性加载到Spring的Environment中
 *  以便应用中使用，它通长用来在Spring配置类中生命配置文件，并在 Spring 的 @Value 或 @ConfigurationProperties 注解中引用这些属性。
 *
 *  Spring默认不支持通过 @PropertySource加载.yml文件，因此如果你希望加载YML文件，需要实现一个自定义的PropertySourceFactory
 */
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        String sourceName = resource.getResource().getFilename();
        if (StrUtil.isNotBlank(sourceName) && StrUtil.endWithAny(sourceName, ".yml", ".yaml")) {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return new PropertiesPropertySource(sourceName, factory.getObject());
        }
        return super.createPropertySource(name, resource);
    }
}
